引导客户端和无连接协议

    下表是 Bootstrap 的常用方法,其中很多是继承自 AbstractBootstrap。

    Table 9.1 Bootstrap methods

    Bootstrap 类负责创建管道给客户或应用程序,利用无连接协议和在调用 bind() 或 connect() 之后。

    下图展示了如何工作

    1. 当 bind() 调用时,Bootstrap 将创建一个新的管道, 当 connect() 调用在 Channel 来建立连接
    2. Bootstrap 将创建一个新的管道, 当 connect() 调用时

    Figure 9.2 Bootstrap process

    Listing 9.1 Bootstrapping a client

    1. 创建一个新的 Bootstrap 来创建和连接到新的客户端管道
    2. 指定 EventLoopGroup
    3. 指定 Channel 实现来使用
    4. 设置处理器给 Channel 的事件和数据
    5. 连接到远端主机

    注意 Bootstrap 提供了一个“流利”语法——示例中使用的方法(除了connect()) 由 Bootstrap 返回实例本身的引用链接他们。

    Channel 的实现和 EventLoop 的处理过程在 EventLoopGroup 中必须兼容,哪些 Channel 是和 EventLoopGroup 是兼容的可以查看 API 文档。经验显示,相兼容的实现一般在同一个包下面,例如使用NioEventLoop,NioEventLoopGroup 和 NioServerSocketChannel 在一起。请注意,这些都是前缀“Nio”,然后不会用这些代替另一个实现和另一个前缀,如“Oio”,也就是说 OioEventLoopGroup 和NioServerSocketChannel 是不相容的。

    Channel 和 EventLoopGroup 的 EventLoop 必须相容,例如NioEventLoop、NioEventLoopGroup、NioServerSocketChannel是相容的,但是 OioEventLoopGroup 和 NioServerSocketChannel 是不相容的。从类名可以看出前缀是“Nio”的只能和“Nio”的一起使用。

    EventLoop 和 EventLoopGroup

    记住,EventLoop 分配给该 Channel 负责处理 Channel 的所有操作。当你执行一个方法,该方法返回一个 ChannelFuture ,它将在 分配给 Channel 的 EventLoop 执行。

    清单9.2所示的结果,试图使用一个 Channel 类型与一个 EventLoopGroup 兼容。

    Listing 9.2 Bootstrap client with incompatible EventLoopGroup

    1. 注册 EventLoopGroup 用于获取 EventLoop
    2. 指定要使用的 Channel 类。通知我们使用 NIO 版本用于
      EventLoopGroup , OIO 用于 Channel
    3. 设置处理器用于管道的 I/O 事件和数据
    4. 尝试连接到远端。当 NioEventLoopGroup 和 OioSocketChannel 不兼容时,会抛出 IllegalStateException 异常

    IllegalStateException 显示如下:

    Listing 9.3 IllegalStateException thrown because of invalid configuration

    出现 IllegalStateException 的其他情况是,在 bind() 或 connect() 调用前 调用需要设置参数的方法调用失败时,包括:

    • group()
    • handler()

    handler() 方法尤为重要,因为这些 ChannelPipeline 需要适当配置。
    一旦提供了这些参数,应用程序将充分利用 Netty 的能力。